#include "interface.h"
#include "aip-cpp-sdk/face.h"


using namespace std;

Face::Face(std::string model ){
    classifier.load(model);
}


int Face::detect(cv::Mat image, cv::Rect& face)
{
    cv::cvtColor(image, image, CV_BGR2GRAY);  // 将彩色图像转为灰色图像，因为分类器只能处理灰色图像；
    equalizeHist(image, image);  // 对灰色图像进行均衡化处理，可以提高分类器处理准确率；
    vector<cv::Rect> faces;
    classifier.detectMultiScale(image, faces, 1.1, 3, 0, cv::Size(50, 50));  // 分类器进行人脸检测；

    if(faces.size())  // 容器中矩形的个数：size为0表示没有检测到人脸；size>0表示检测到人脸的个数。
    {
       face = faces[0];  //将容器中第一个矩形返回给face引用。
       return 1;
    }
    else
    {
        return 0;
    }
}


int Face::recognize(cv::Mat face, Employee& e)
{
    string app_id = "22564879";
    string api_key = "cnQ2nrZL2vdYLXk78KpokS0k";
    string secret_key = "cuuzTYv9tZZ4MKYmaIOUAQya33rytDMC";
    // 创建人脸识别客户端
    aip::Face client(app_id, api_key, secret_key);

    vector<unsigned char> buf;
    // 将人脸压缩为jpg格式，保存到buf
    imencode(".jpg", face, buf);
    // 将jpg格式图片编码为BASE64字符串
    string faceimg = aip::base64_encode((char*)buf.data(), buf.size());
    // 将人脸图片发送到百度云进行识别，结果保存到json对象
    Json::Value json = client.search(faceimg, "BASE64", "stu", aip::null);
    // 判断识别是否成功
    if(json["error_code"].asInt())
    {
        cout << json["error_msg"] << endl;
        return 0;
    }
    //Json::StyledWriter writer;
    //cout << writer.write(json) << endl;
    // 解析人脸识别结果，将员工信息保存到Employee结构体
    e.id = json["result"]["user_list"][0]["user_id"].asString();
    e.depart_id = json["result"]["user_list"][0]["group_id"].asString();
    e.info = json["result"]["user_list"][0]["user_info"].asString();
    e.score = json["result"]["user_list"][0]["score"].asString();
    e.dscore = json["result"]["user_list"][0]["score"].asDouble();
    // 如果识别分数小于80，打印分数返回0
    if(e.dscore < 80.0)
    {
        cout << "人脸匹配度：" << e.dscore << endl;
        return 0;
    }
    cout << "人脸匹配度：" << e.dscore << endl;
    return 1;
}
